from fastapi import APIRouter, Depends, Query, UploadFile, File, Form
from typing import Optional

from app.modules.files.services import FileService
from app.modules.files.schemas import FileResponse, FileListResponse
from app.core.responses import success_response
from app.core.dependencies import get_current_user
from app.modules.users.models import UserModel

router = APIRouter(
    prefix="/api/files",
    tags=["文件管理"],
    dependencies=[Depends(get_current_user)]
)


@router.post("/upload", summary="上传单个文件", response_model=FileResponse)
async def upload_single_file(
    file: UploadFile = File(..., description="要上传的文件"),
    sub_dir: Optional[str] = Form(None, description="存储的子目录，例如 'avatars'"),
    current_user: UserModel = Depends(get_current_user)
):
    """
    上传单个文件。
    - 需要认证。
    - 可以指定一个子目录来分类存储。
    """
    file_record = await FileService.upload_file(file, current_user, sub_dir or "")
    return success_response(data=FileResponse.from_orm(file_record), message="文件上传成功")


@router.put("/{file_id}", summary="更新文件", response_model=FileResponse)
async def update_existing_file(
    file_id: int,
    file: UploadFile = File(..., description="要上传的新文件"),
    sub_dir: Optional[str] = Form(None, description="存储的子目录，例如 'avatars'"),
    current_user: UserModel = Depends(get_current_user)
):
    """
    更新现有文件。
    - 需要提供文件ID。
    - 上传新文件以替换旧文件。
    - 旧的物理文件将被删除。
    """
    file_record = await FileService.update_file(file_id, file, current_user, sub_dir or "")
    return success_response(data=FileResponse.from_orm(file_record), message="文件更新成功")


@router.get("", summary="获取文件列表", response_model=FileListResponse)
async def get_all_files(
    page: int = Query(1, ge=1, description="页码"),
    size: int = Query(10, ge=1, le=100, description="每页数量"),
    uploader_id: Optional[int] = Query(None, description="按上传者ID筛选"),
    filename: Optional[str] = Query(None, description="按原始文件名筛选（模糊）"),
    current_user: UserModel = Depends(get_current_user)
):
    """
    获取文件分页列表，支持按上传者和文件名筛选。
    """
    # 在这里可以加入权限控制，例如只有管理员才能查看所有文件
    
    total, files = await FileService.get_file_list(
        skip=(page - 1) * size,
        limit=size,
        uploader_id=uploader_id,
        filename=filename
    )
    
    return success_response(data={
        "total": total,
        "items": [FileResponse.from_orm(f) for f in files]
    })


@router.get("/{file_id}", summary="获取文件详情", response_model=FileResponse)
async def get_file_details(
    file_id: int,
    current_user: UserModel = Depends(get_current_user)
):
    """
    根据文件ID获取文件的详细信息。
    """
    file_record = await FileService.get_file_by_id(file_id)
    return success_response(data=FileResponse.from_orm(file_record))


@router.delete("/{file_id}", summary="删除文件")
async def delete_single_file(
    file_id: int,
    current_user: UserModel = Depends(get_current_user)
):
    """
    根据文件ID删除文件。
    - 将会从磁盘和数据库中同时删除。
    - 可添加权限，例如只有上传者或管理员才能删除。
    """
    await FileService.delete_file(file_id)
    return success_response(message="文件删除成功") 